package com.app.miwawa.cui.esm;

import java.sql.BatchUpdateException;

import org.framework.common.api.support.model.ProcessModel;
import org.framework.common.cui.AbstractController;
import org.framework.common.ext.util.StringUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.app.miwawa.api.esm.entity.customer.Customer;
import com.app.miwawa.api.esm.entity.customer.Parents;
import com.app.miwawa.api.esm.service.bo.CustomerBo;
import com.easemob.server.example.utils.EasemobUtils;

/**
 * 用户界面请求控制器类
 * <p>描述: 客户资料</p>
 * <p>Company: Professional</p>
 * @author chanlong(陈龙)
 * @date 2016年1月23日 上午9:13:11
 * @version 1.0.2016
 */
@RestController
public class CustomerController extends AbstractController{
	
	@Autowired
	private CustomerBo customerBo;
	
	/**
	 * 保存客户信息.
	 * @param dbname
	 * @param entity
	 * @return
	 * @throws Exception
	 * @author chanlong(陈龙)
	 * @date 2016年4月30日 下午1:06:12
	 */
	@RequestMapping("/{dbname}/customer/save")
	public Object save(@PathVariable final String dbname, @ModelAttribute final Customer entity) throws Exception {
		// 参数检查
		if (check(dbname)) return error("请检查数据源或参数绑定源。");
		
		try{
			// 注册数据源
			registerDataSource(dbname);
			
			// 设置编码
			entity.setCode(customerBo.maxcode());
			
			// 保存实体对象
			return customerBo.insert(entity);
		}catch (BatchUpdateException e) {
			return error("不能输入非法字符！", e);
		} catch (Exception e) {
			return error("保存客户信息失败！", e);
		}
	}
	
	/**
	 * 保存家长信息.
	 * @param dbname
	 * @param entity
	 * @return
	 * @throws Exception
	 * @author chanlong(陈龙)
	 * @date 2016年4月30日 下午1:06:12
	 */
	@RequestMapping("/{dbname}/parents/save")
	public Object saveParents(@PathVariable final String dbname, @ModelAttribute final Parents entity) throws Exception {
		// 参数检查
		if (check(dbname)) return error("请检查数据源或参数绑定源。");
		
		try{
			// 注册数据源
			registerDataSource(dbname);
			
			// 保存实体对象
			 return  entity.save(dbname);
			
		} catch (Exception e) {
			e.printStackTrace();
			return error("保存家长信息失败！", e);
		}
	}
	
	/**
	 * 删除家长信息.
	 * @param dbname
	 * @param entity
	 * @return
	 * @throws Exception
	 * @author chanlong(陈龙)
	 * @date 2016年4月30日 下午1:06:12
	 */
	@RequestMapping("/{dbname}/parents/delete/{id}")
	public Object deleteParents(@PathVariable final String dbname, @PathVariable final String id) throws Exception {
		// 参数检查
		if (check(dbname)) return error("请检查数据源或参数绑定源。");
		
		try{
			// 注册数据源
			registerDataSource(dbname);
			
			ProcessModel process = ProcessModel.factory();
			
			Long count = process.jdbc.queryForObject(process.properties.getProperty("customer.parents.count"), Long.class,id);
			
			if(count == 1){
				String uid = process.jdbc.queryForObject(process.properties.getProperty("customer.appuser.id"), String.class, id);
				
				if(EasemobUtils.deleteIMUser("C"+uid) || StringUtil.isNotEmpty(uid)){
					
					// 删除家长APP端环信账号同步信息
					process.jdbc.update(process.properties.getProperty("customer.delete.easemob"), uid);
					// 删除家长APP端账号
					process.jdbc.update(process.properties.getProperty("customer.delete.appuser"), uid);
					// 删除成功提示
					System.out.println("APP账号和环信账号删除成功");
				}
			}
			
			// 删除客户的家长信息
			process.jdbc.update(process.properties.getProperty("customer.delete.id"), id);
			
			return success("家长信息已删除！");
			
		} catch (Exception e) {
			e.printStackTrace();
			return error("保存家长信息失败！", e);
		}
	}
	
	/**
	 * 更新客户信息（状态更新）.
	 * @param dbname
	 * @param entity
	 * @return
	 * @throws Exception
	 * @author chanlong(陈龙)
	 * @date 2016年4月30日 下午1:06:31
	 */
	@RequestMapping("/{dbname}/customer/update")
	public Object update(@PathVariable final String dbname, @ModelAttribute final Customer entity) throws Exception {
		// 参数检查
		if (check(dbname)) return error("请检查数据源或参数绑定源。");
		
		try{
			// 注册数据源
			registerDataSource(dbname);
			
			// 更新实体对象
			customerBo.update(entity);
			
			return entity;
		} catch (Exception e) {
			return error("更新客户信息失败！", e);
		}
	}
	
	/**
	 * 更新客户信息（顾问分配）.
	 * @param dbname
	 * @param ids
	 * @param entity
	 * @return
	 * @throws Exception
	 * @author chanlong(陈龙)
	 * @date 2016年4月30日 下午1:07:29
	 */
	@RequestMapping("/{dbname}/customer/update/{ids}")
	public Object update(@PathVariable final String dbname, @PathVariable final String[] ids, @ModelAttribute final Customer entity) throws Exception {
		// 参数检查
		if (check(dbname)) return error("请检查数据源或参数绑定源。");
		
		try{
			// 注册数据源
			registerDataSource(dbname);
			
			// 更新实体对象
			Integer result = customerBo.update(ids, entity);
			
			return success(result);
		} catch (Exception e) {
			return error("更新客户信息失败！", e);
		}
	}
	
	/**
	 * 流失客户还原.
	 * @param dbname
	 * @param ids
	 * @param entity
	 * @return
	 * @throws Exception
	 * @author chanlong(陈龙)
	 * @date 2016年4月30日 下午1:07:29
	 */
	@RequestMapping("/{dbname}/customer/reback")
	public Object reback(@PathVariable final String dbname, @ModelAttribute final Customer entity) throws Exception {
		// 参数检查
		if (check(dbname)) return error("请检查数据源或参数绑定源。");
		
		try{
			// 注册数据源
			registerDataSource(dbname);
			
			ProcessModel process = ProcessModel.factory();
			
			process.jdbc.batchUpdate(new String[]{
				// 流失客户还原
				process.properties.getProperty("customer.reback.id"), entity.getId(),
				// 删除流失记录
				process.properties.getProperty("customer.delete.lost"), entity.getId()
			});
			
			return success("恢复流失客户成功！");
		} catch (Exception e) {
			return error("恢复流失客户失败！", e);
		}
	}
	
	/**
	 * 修改诺访记录.
	 * @param dbname
	 * @param bespokeid
	 * @return
	 * @throws Exception
	 * @author chanlong(陈龙)
	 * @date 2016年4月30日 下午1:07:29
	 */
	@RequestMapping("/{dbname}/customer/bespoke/edit/{bespokeid}")
	public Object editBespoke(@PathVariable final String dbname,@PathVariable final String bespokeid)throws Exception{
		if (check(dbname)) return error("请检查数据源或参数绑定源。");
		try{
			// 注册数据源
			registerDataSource(dbname);
			
			ProcessModel process =ProcessModel.factory();
	
			process.jdbc.update(process.properties.getProperty("customer.update.bespoke"),bespokeid);
			
			return success("修改诺访记录成功！");
		} catch (Exception e) {
			return error("修改诺访记录失败！", e);
		}
	}
	
	/**
	 * 更新试听状态.
	 * @param dbname
	 * @param bespokeid
	 * @return
	 * @throws Exception
	 * @author chanlong(陈龙)
	 * @date 2016年4月30日 下午1:07:29
	 */
	@RequestMapping("/{dbname}/customer/audition/edit/{bespokeid}")
	public Object editAudition(@PathVariable final String dbname,@PathVariable final String bespokeid)throws Exception{
		if (check(dbname)) return error("请检查数据源或参数绑定源。");
		try{
			// 注册数据源
			registerDataSource(dbname);
			
			ProcessModel process = ProcessModel.factory();
			
			process.jdbc.update(process.properties.getProperty("customer.update.audition"),bespokeid);
			
			return success("更新试听记录成功！");
		} catch (Exception e) {
			return error("更新试听记录失败！", e);
		}
	}
}
